import { StringUtils, } from "@/util/common/utils";
import { HttpStatus } from "@/util/common/constant";

export class AjaxResult extends Map<string, Object> {

    /** 状态码 */
    readonly CODE_TAG = "code";

    /** 返回内容 */
    readonly MSG_TAG = "msg";

    /** 数据对象 */
    readonly DATA_TAG = "data";

    /**
     * 初始化一个新创建的 AjaxResult 对象
     * 
     * @param code 状态码
     * @param msg 返回内容
     */
    AjaxResult(code?: number, msg?: string, data?: Object) {
        if (code && msg) {
            super.set(this.CODE_TAG, code);
            super.set(this.MSG_TAG, msg);
            if (StringUtils.isNotNull(data)) {
                super.set(this.DATA_TAG, data);
            }
        }
    }

    static success(msg?: string, data?: Object) {
        if (msg && (data || data == null)) {
            let ajax = new AjaxResult();
            ajax.AjaxResult(HttpStatus.SUCCESS, msg, data)
            return ajax
        } else if (typeof msg === "string") {
            return AjaxResult.success(msg, null);
        } else if (msg) {
            return AjaxResult.success("操作成功", msg);
        } else {
            return AjaxResult.success("操作成功");
        }
    }

    static warn(msg?: string, data?: Object) {
        if (msg && (data || data == null)) {
            let ajax = new AjaxResult();
            ajax.AjaxResult(HttpStatus.WARN, msg, data)
            return ajax;
        } else {
            return AjaxResult.warn(msg, null);
        }
    }

    static error(msg?: string, data?: Object) {
        if (msg && (data || data == null)) {
            let ajax = new AjaxResult();
            ajax.AjaxResult(HttpStatus.ERROR, msg, data);
            return ajax;
        } else if (typeof msg == "number" && typeof data == "string") {
            let ajax = new AjaxResult();
            ajax.AjaxResult(msg, data, null);
            return ajax;
        } else if (typeof msg === "string") {
            return AjaxResult.error(msg, null);
        } else {
            return AjaxResult.error("操作失败");
        }
    }

    put(key: string, value: Object) {
        super.set(key, value);
        return this;
    }
}